local TF_MILKER = Class(function(self, inst)
    self.inst = inst

    -- 初始化：确保挂载 timer 组件
    if not inst.components.timer then
        inst:AddComponent("timer")
    end

    -- 给牛打一个标记，用于可视化或调试：当可以挤奶时保留，否则移除
    inst:AddTag("can_be_milked")

    -- 监听 timer 组件的“timerdone”事件，用于冷却结束后刷新标签
    inst:ListenForEvent("timerdone", function(inst, data)
        if data.name == "milk_cd" then
            self:RefreshTag()
        end
    end)

    -- 刷新一次标签状态
    self:RefreshTag()
end)

-- 判断当前是否可以挤奶：只有当 "milk_cd" 定时器不存在或已结束时，才可挤奶
function TF_MILKER:CanMilk()
    return not self.inst.components.timer:TimerExists("milk_cd")
end

-- 执行挤奶动作
-- doer：发起挤奶的玩家
function TF_MILKER:Milk(doer)
    if not self:CanMilk() then
        self.inst:RemoveTag("can_be_milked")
        return false, "NOT_READY"
    end

    local x, y, z = self.inst.Transform:GetWorldPosition()
    -- 随机 1～5 瓶 tf_milk
    local num = math.random(1, 5)
    for i = 1, num do
        local milk = SpawnPrefab("tf_milk")
        if milk and milk.Transform then
            -- 在牛脚下随机一个小偏移
            local angle = math.random() * 2 * PI
            local dist = math.random() * 0.5
            milk.Transform:SetPosition(x + math.cos(angle) * dist, 0, z - math.sin(angle) * dist)
        end
    end

    -- 启动冷却定时器：24分钟 = 1440秒
    self.inst.components.timer:StartTimer("milk_cd", 1440)

    -- 刷新标签
    self:RefreshTag()

    self.inst.sg:GoToState("pleased")
    return true
end

-- 根据定时器状态刷新“can_be_milked”标签
function TF_MILKER:RefreshTag()
    if self:CanMilk() then
        self.inst:AddTag("can_be_milked")
    else
        self.inst:RemoveTag("can_be_milked")
    end
end

-- 保存时不需要额外处理，因为 timer 组件会自动保存“milk_cd”剩余时间
function TF_MILKER:OnSave()
    -- 返 nil 就行，timer 会自动存储
    return {
        tf_canmilk = self:CanMilk() and true or nil,
    }
end

-- 加载时只需刷新标签，timer 自动恢复
function TF_MILKER:OnLoad(data)
    if data and data.tf_canmilk then
        self.inst:AddTag("can_be_milked")
    else
        self.inst:RemoveTag("can_be_milked")
    end
end

return TF_MILKER
